package com.ls.utils.weixin;


import com.alibaba.fastjson.JSONObject;
import com.ls.utils.PhoneUtils;
import com.ls.utils.SecuritySHA1Utils;
import com.ls.utils.http.HttpUtils;
import com.ls.utils.login.OpenId;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.*;

/**
 * 微信公众号工具
 */
@Slf4j
@Component
public class WeChatGzhUtils {

    @Autowired
    WxUtil wxUtil;
    @Value("${gongzhonghaodomain.domain}")
    private String domain;
//    @Resource
//    ISchoolWeixinService schoolWeixinService;
//    @Resource
//    ISchoolService schoolService;
//    @Resource
//    IGuardianService guardianService;

    public static final String WX_SUCCESS = "ok";
    /**
     * 此参数为固定参数所有公众号必须一致
     */
    public static String token = "GEhyYecG51ghxEmU";
    /**
     * 公众号服务号的参数
     */
    public static String FWH_appId = "wx696ce788e450b300";
    public static String FWH_appSecert = "74312709159607244574fd41aa71688d";


    /***/
    public String getGzhSignature(String signature, String timestamp, String nonce) throws Exception {
        List<String> paramsList = new ArrayList<>();
        paramsList.add(timestamp);
        paramsList.add(nonce);
        paramsList.add(token);

        Collections.sort(paramsList, new Comparator<String>() {
            //升序排序
            public int compare(String o1,
                               String o2) {
                return o1.compareTo(o2);
            }
        });
        //把列表拼成一个长的字符串
        String str = "";
        for (int i = 0; i < paramsList.size(); i++) {
            str += paramsList.get(i);
        }

        return SecuritySHA1Utils.shaEncode(str);
    }


    /**
     * 发送公众号固定模板消息(此方法仅为未接来电)
     *
     * @param openId  用户的openid，必须前端登陆过一次才有
     * @param title   通知标题
     * @param inPhone 来电号码
     * @param inTime  来电时间
     * @param myPhone 本机号码
     * @param remark  模板消息最下方的备注信息
     * @return 返回是否发送成功
     * @Author songge
     * @Modifu pengyu 异步用线程池处理
     */
    public String sendModelMessageWJLD(@OpenId String openId, String title, String inPhone, String inTime, String myPhone,
                                       String remark) throws IOException {
        String templateId = "MnTm8rHTBkE6p_bM8_AXf8yxRJzof--phc8aP9vxjY8";//固定模板
        log.info("向  " + inPhone + "   " + openId + "   " + " => 发送模板消息 开始");

        JSONObject jsonObject = new JSONObject();
        JSONObject object = new JSONObject();

        object.put("value", title);
        object.put("color", "#173177");
        jsonObject.put("first", object);

        object = new JSONObject();
        String starPhone = PhoneUtils.star(inPhone ,4);
        object.put("value", starPhone);
//        object.put("value", inPhone);
        object.put("color", "#173177");
        jsonObject.put("keyword1", object);

        object = new JSONObject();
        object.put("value", inTime);
        object.put("color", "#173177");
        jsonObject.put("keyword2", object);

        object = new JSONObject();
        // 20220927 这里的 myPhone 中间加星号显示
//        String starPhone = PhoneUtils.star(myPhone ,4);
//        object.put("value", starPhone);
        object.put("value", myPhone);
        object.put("color", "#173177");
        jsonObject.put("keyword3", object);
        object = new JSONObject();

        object = new JSONObject();
        object.put("value", remark);
        object.put("color", "#173177");
        jsonObject.put("remark", object);

        String url = domain + "/weixinMiss.html?type=3&debug=1&&phone=" + myPhone + "&openId=" + openId;

        String res = sendModelMessage(true, wxUtil.getAccessToken(FWH_appId, FWH_appSecert), openId, templateId, url,
                jsonObject);

        log.info("向  " + inPhone + "   " + openId + "   " + " => 发送模板消息 结果：" + res);
        return res;
    }

    /**
     * 发送模板消息
     *
     * @param isRelease   是否是正式服环境
     * @param token       微信的token
     * @param openId      接受者用户的openid
     * @param template_id 模板id
     * @param jumpUrl     跳转的url 传空null则不会跳转
     * @param data        模板携带的信息(根据不同的模板携带信息不一致)
     * @return 是否发送成功
     */
    private String sendModelMessage(boolean isRelease, String token,
                                    String openId, String template_id, String jumpUrl, Object data) throws IOException {
        String url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + token;


        JSONObject paramsObject = new JSONObject();
        paramsObject.put("touser", openId);
        paramsObject.put("template_id", template_id);
        if (jumpUrl != null) {
            paramsObject.put("url", jumpUrl);
        }
        if (isRelease) {
            paramsObject.put("miniprogram_state", "formal");
        } else {
            paramsObject.put("miniprogram_state", "trial");
        }
        paramsObject.put("data", data);

        String postResult = HttpUtils.sendPost(url, paramsObject.toJSONString());

        JSONObject jsonObject = JSONObject.parseObject(postResult);

        Integer errcode = jsonObject.getInteger("errcode");
        String errmsg = jsonObject.getString("errmsg");

        return errmsg;
    }

    /**
     * 删除公众号的菜单
     *
     * @return 是否发送成功
     */
    public String deleteGzhMenu(String token) throws IOException {
        String url = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=" + token;


        JSONObject paramsObject = new JSONObject();

        String json = paramsObject.toJSONString();
        String postResult = HttpUtils.sendPost(url, json);

        JSONObject jsonObject = JSONObject.parseObject(postResult);

        Integer errcode = jsonObject.getInteger("errcode");
        String errmsg = jsonObject.getString("errmsg");

        return errmsg;
    }


    /**
     * 处理公共消息和动作
     * 参数	描述
     * ToUserName	开发者微信号
     * FromUserName	发送方帐号（一个OpenID）
     * CreateTime	消息创建时间 （整型）
     * MsgType	消息类型，文本为text
     * Content	文本消息内容
     * MsgId	消息id，64位整型
     *
     * @return 恢复是否有处理动作
     */
    public String dealCommonMsg(Map<String, String> resMap) throws Exception {
        String MsgType = resMap.get("MsgType");
        String Content = resMap.get("Content");
        String ToUserName = resMap.get("ToUserName");
        String FromUserName = resMap.get("FromUserName");
        if ("text".equals(MsgType)) {//普通文本消息
//            if ("绑定学生".equals(Content)) {
//                return replyWebMsg(resMap, "绑定学生", "点击注册绑定学生", "", domain + "/login.html");
//            }
        }
        return "";
    }

    /**
     * 回复文本消息
     * <p>
     * 参数	是否必须	描述
     * ToUserName	是	接收方帐号（收到的OpenID）
     * FromUserName	是	开发者微信号
     * CreateTime	是	消息创建时间 （整型）
     * MsgType	是	消息类型，文本为text
     * Content	是	回复的消息内容（换行：在content中能够换行，微信客户端就支持换行显示）
     * <p>
     */
    public String replyTextMsg(Map<String, String> originMap, String content) throws Exception {
        HashMap resMap = new HashMap();
        //发送者和接受者互换顺序
        resMap.put("ToUserName", originMap.get("FromUserName"));
        resMap.put("FromUserName", originMap.get("ToUserName"));
        resMap.put("CreateTime", System.currentTimeMillis() + "");
        resMap.put("MsgType", "text");
        resMap.put("Content", content);

        String xml = WxPayUtil.mapToXml(resMap);
        return xml;
    }


    /**
     * 回复网页消息
     * <p>
     * 参数	是否必须	说明
     * ToUserName	是	接收方帐号（收到的OpenID）
     * FromUserName	是	开发者微信号
     * CreateTime	是	消息创建时间 （整型）
     * MsgType	是	消息类型，图文为news
     * ArticleCount	是	图文消息个数；当用户发送文本、图片、语音、视频、图文、地理位置这六种消息时，开发者只能回复1条图文消息；其余场景最多可回复8条图文消息
     * Articles	是	图文消息信息，注意，如果图文数超过限制，则将只发限制内的条数
     * Title	是	图文消息标题
     * Description	是	图文消息描述
     * PicUrl	是	图片链接，支持JPG、PNG格式，较好的效果为大图360*200，小图200*200
     * Url	是	点击图文消息跳转链接
     * <p>
     */
    public String replyWebMsg(Map<String, String> originMap, String Title, String Description, String PicUrl, String Url) throws Exception {
        HashMap resMap = new HashMap();
        //发送者和接受者互换顺序
        resMap.put("ToUserName", originMap.get("FromUserName"));
        resMap.put("FromUserName", originMap.get("ToUserName"));
        resMap.put("CreateTime", System.currentTimeMillis() + "");
        resMap.put("MsgType", "news");
        resMap.put("ArticleCount", "1");

        HashMap articles = new HashMap();
        HashMap item = new HashMap();
        item.put("Title", Title);
        item.put("Description", Description);
        item.put("PicUrl", PicUrl);
        item.put("Url", Url);

        articles.put("item", item);

        resMap.put("Articles", articles);

        String xml = WxPayUtil.mapToSignXml(resMap, 0);
        return xml;
    }

}
